package com.tulele.vtool.mapper;

import com.tulele.vtool.model.ArticleInfo;
import com.tulele.vtool.model.ArticleLikeInfo;
import com.tulele.vtool.model.LookArticleInfo;
import com.tulele.vtool.model.combinedEntity.*;
import com.tulele.vtool.model.respEntity.ArticleRespEntity;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Component(value = "articleInfoMapper")
public interface ArticleInfoMapper {

    /**
     * 添加文章信息
     * @param articleInfo
     * @return
     */
    int addArticleInfo(ArticleInfo articleInfo);

    /**
     * 添加文章信息
     * @param articleInfo
     * @return
     */
    int addMaterialVideoByDouDouInfo(ArticleInfo articleInfo);

    /**
     * 更新文章信息
     * @param articleInfo
     * @return
     */
    int updateArticleInfo(ArticleInfo articleInfo);

    /**
     * 获取文章详情
     * @param articleId
     * @return
     */
    ArticleInfo queryArticleDetailInfo(Integer articleId);

    /**
     * 查询用户查看他人文章信息
     * @param lookArticleInfo
     * @return
     */
    List<CombinedUserLookOtherArticleInfo> queryUserLookOtherArticleInfo(LookArticleInfo lookArticleInfo);

    /**
     * 根据品牌查询文章信息
     * @param userId
     * @return
     */
    List<CombinedArticleInfoByArticleBrand> queryArticleInfoByBrand(Integer userId);

    /**
     * 根据文章类型查询文章信息
     * @param articleTypeId
     * @return
     */
    List<CombinedArticleInfoByArticleType> queryArticleInfoByArticleType(Integer articleTypeId);

    /**
     * 查询指定数目的用户文章
     * @param userId
     * @return
     */
    List<CombinedUserArticleInfoBySpecialSize> queryUserArticleInfoBySpecialSize(@Param("userId") Integer userId, @Param("recordSize") int recordSize);

    /**
     * 查询用户文章
     * @param userId
     * @return
     */
    List<CombinedUserOwnArticleInfo> queryUserOwnArticleInfo(Integer userId);

    /**
     * 删除文章信息
     * @param articleInfo
     * @return
     */
    int deleteUserArticleInfo(ArticleInfo articleInfo);

    /**
     * 查询文章用户信息
     * @param articleId
     * @return
     */
    Integer queryArticleUserInfo(Integer articleId);

    /**
     * 平台推荐文章信息
     * @return
     */
    List<PlatformRecommendArticleInfo> queryPlatformRecommendArticleInfo();

    /**
     * 查询第三方爬取文章信息
     * @param articleInfo
     * @return
     */
    ArticleInfo querySpiderArticleInfoByThirdArticleId(ArticleInfo articleInfo);

    /**
     * 查询用户平台文章分享状态
     * @param articleInfo
     * @return
     */
    Integer queryUserPlatformArticleShareStatus(ArticleInfo articleInfo);

    /**
     * 查询平台品牌文章数据
     * @param brandId
     * @return
     */
    Integer queryPlatformArticleCountByBrandId(Integer brandId);

    /**
     * 查询平台类型文章数据
     * @param typeId
     * @return
     */
    Integer queryPlatformArticleCountByTypeId(Integer typeId);

    /**
     * 获取待处理的爬虫文章
     * @return
     */
    List<ArticleInfo> queryToBeProcessedSpiderArticleInfo();

    /**
     * 根据品牌查询平台给用户推荐文章
     * @return
     */
    List<PlatformRecommendArticleInfo> queryPlatformRecommendArticleInfoByBrand(@Param("brandIds")List<Integer> useBrandIds);

    /**
     * 根据类型查询平台给用户推荐文章
     * @return
     */
    List<PlatformRecommendArticleInfo> queryPlatformRecommendArticleInfoByType(Integer articleTypeId);

    /**
     * 根据类型查询多条平台给用户推荐文章
     * @param articleTypeId 文章类型 ID
     * @param recordSize 数量
     * @return
     */
    List<PlatformRecommendArticleInfo> getPlatformRecommendArticleInfoByTypeAndRecordSize(@Param("articleTypeId") Integer articleTypeId, @Param("recordSize") Integer recordSize);

    /**
     * 根据品牌随机查询文章信息
     * @param articleBrandId
     * @param recordSize
     * @return
     */
    List<CombinedArticleInfoByArticleBrand> queryArticleInfoByBrandForRand(@Param("articleBrandId")Integer articleBrandId, @Param("recordSize") int recordSize);

    /**
     * 根据文章类型随机查询文章信息
     * @param articleTypeId
     * @param recordSize
     * @return
     */
    List<CombinedArticleInfoByArticleType> queryArticleInfoByArticleTypeForRand(@Param("articleTypeId")Integer articleTypeId, @Param("recordSize") int recordSize);

    /*ljt 20201027 start*/
    /**
     * 根据文章类型id倒序查询文章信息
     * @param articleTypeId
     * @return
     */
    List<CombinedArticleInfoByArticleBrand> queryAllByTypeIds(@Param("articleTypeIds")List<Integer> articleTypeId);
    /*ljt 20201027 end*/

    /**
     * 根据文章类型随机查询文章信息
     * @param articleTypeId
     * @param recordSize
     * @return
     */
    List<CombinedArticleInfoByArticleType> queryArticleInfoByUserArticleTypeForRand(@Param("articleTypeIds")List<Integer> articleTypeId, @Param("recordSize") int recordSize);

    /**
     * 更新站内文章阅读数
     * @param articleId
     * @return
     */
    int updArticleInReadCount(Integer articleId);

    /**
     * 更新站外文章阅读数
     * @param articleId
     * @return
     */
    int updArticleOutReadCount(Integer articleId);

    /**
     * 更新文章分享数
     * @param articleId
     * @return
     */
    int updArticleShareCount(Integer articleId);

    /**
     * 查询待添加至redis的品牌文章信息
     * @return
     */
    List<CombinedArticleInfoByArticleBrand> queryToBeAddToRedisArticleInfoOfBrand();

    /**
     * 查询需要从redis中移除的品牌文章信息
     * @return
     */
    List<CombinedArticleInfoByArticleBrand> queryToBeRemoveFromRedisArticleInfoOfBrand();

    /**
     * 查询待添加至redis的类型文章信息
     * @return
     */
    List<CombinedArticleInfoByArticleBrand> queryToBeAddToRedisArticleInfoOfType();

    /**
     * 查询需要从redis中移除的类型文章信息
     * @return
     */
    List<CombinedArticleInfoByArticleBrand> queryToBeRemoveFromRedisArticleInfoOfType();

    /**
     * 临时查询无缩略图的文章
     * @return
     */
    List<CombinedArticleInfoByArticleBrand> tempQueryThumbnailNullInfo();

    /**
     * 查询用户分享的文章数目
     * @param userId
     * @return
     */
    Integer queryUserSharedArticleCount(@Param("userId")Integer userId);

    /**
     * 根据文章类型的文章热度值查询文章信息
     * @param articleTypeId
     * @return
     */
    List<ArticleListShowInfo> queryArticleInfoByArticleTypeForHotScore(@Param("articleTypeId")Integer articleTypeId, @Param("articleHotValue")Integer articleHotValue,@Param("gzhCode") String gzhCode);
    //兼容测试环境sql版本
    List<ArticleListShowInfo> queryArticleInfoByArticleTypeForHotScoreTest(@Param("articleTypeId")Integer articleTypeId, @Param("articleHotValue")Integer articleHotValue,@Param("gzhCode") String gzhCode);
    void insertArticleInfoByArticleType(@Param("articleTypeId")Integer articleTypeId,@Param("gzhCode") String gzhCode);

    /**
     * 根据文章类型的文章热度值查询文章总数
     * @param articleBrandId
     * @param articleHotValue
     * @return
     */
    List<ArticleListShowInfo> queryArticleInfoByArticleBrandForHotScore(@Param("articleBrandId")Integer articleBrandId, @Param("articleHotValue")Integer articleHotValue,@Param("gzhCode") String gzhCode);
    //兼容测试环境sql版本
    List<ArticleListShowInfo> queryArticleInfoByArticleBrandForHotScoreTest(@Param("articleBrandId")Integer articleBrandId, @Param("articleHotValue")Integer articleHotValue);
    void insertArticleInfoByArticleBrand(@Param("articleBrandId")Integer articleBrandId);
    /**
     * 根据关键字热度值查询文章总数
     * @param keyWorks
     * @return
     */
    List<ArticleListShowInfo> queryArticleInfoByKeyWorksForHotScore(@Param("keyWorks")String keyWorks);

    /**
     * 根据文章类型的文章热度值查询指定数目的文章信息
     * @param articleTypeId
     * @return
     */
    List<ArticleListShowInfo> queryArticleInfoByArticleTypeForHotScoreBySpecialSize(@Param("articleTypeId")Integer articleTypeId, @Param("articleHotValue")Integer articleHotValue, @Param("recordSize")Integer recordSize);

    /**
     * 根据标题查询用户已经添加的微信文章ID
     * @param articleTitle
     * @return
     */
    ArticleInfo queryUserAddedWxArticleInfoByTitle(@Param("userId")Integer userId, @Param("articleTitle")String articleTitle);

    /**
     * 根据分页查询视频
     * @param
     * @return
     */
    List<ArticleInfo> selectArticleByVideo(List<Integer> ids, List<Integer> bid);

    List<ArticleInfo> selectArticleByArticleType(@Param("ids") String ids);

    List<ArticleInfo> selectArticleByArticleTypeAndBrandId(List<Integer> ids, List<Integer> bid);

    List<ArticleInfo> selectMaterialByBrandId(Integer articleBrandId);

    Integer selectLikeNum(Integer id);

    String selectMaterialImgUrl(Integer id);

    String selectMaterialVideoUrl(Integer id);

    String selectMaterialVideoFormat(Integer id);

    List<ArticleInfo> selectMaterialByArticleTypeId(Integer articleTypeId);

    Integer isLike(@Param("userId")Integer userId, @Param("articleId")Integer id);

    List<ArticleInfo> selectArticleByUserAttention(@Param("bid")List<Integer> userBrandIds, @Param("ids")List<Integer> userConcernArticleTypeIds);

    void addLike(ArticleLikeInfo articleLikeInfo);

    void delLike(ArticleLikeInfo articleLikeInfo);

    List<ArticleInfo> getArticleByBrandId(Integer articleBrandId);

    List<ArticleInfo> getArticleByArticleTypeId(Integer articleTypeId);

    List<ArticleInfo> getArticleByUserAttention(@Param("bid")List<Integer> userBrandIds, @Param("ids")List<Integer> userConcernArticleTypeIds);

    List<ArticleInfo> getVideoByBrandId(Integer articleBrandId);

    List<ArticleInfo> getVideoByTypeId(Integer articleTypeId);

    List<ArticleInfo> getVideoByUserAttention(@Param("bid")List<Integer> userBrandIds, @Param("ids")List<Integer> userConcernArticleTypeIds);

    Integer saveLocallyNum(@Param("gzhCode") String gzhCode, @Param("vipStatus")Integer vipStatus);

    Integer selectCheckNum(@Param("userId")Integer userId, @Param("gzhCode")String gzhCode);

    void addCheckRecord(@Param("userId")Integer userId, @Param("articleId")Integer articleId, @Param("gzhCode")String gzhCode,@Param("isSaveLocal")Integer isSaveLocal);

    List<Integer> selectCheckList(@Param("userId")Integer userId, @Param("gzhCode")String gzhCode);

    Integer selectIsSaveLocalByArticleId(@Param("userId")Integer userId, @Param("articleId")Integer articleId, @Param("gzhCode")String gzhCode);

    void addUserAttentionMaterial(ArticleRespEntity articleRespEntity);

    void insertMaterialImg(@Param("id") Integer id, @Param("materialImgUrls") String materialImgUrls);

    List<ArticleInfo> selectMaterialByUserId(Integer userId);

    void delMaterialById(ArticleInfo articleInfo);

    void delMateriaImglById(Integer id);

    /**
     * 常见问题 id ，公众号标识，查询 常见问题 多条数据
     *
     * @param articleTypeId 品牌 常见问题id
     * @param gzhCode 公众号标识
     * @return 对象列表
     */
    List<CombinedArticleInfoByArticleBrand> selectManualByLimit(@Param("articleTypeId")Integer articleTypeId, @Param("gzhCode")String gzhCode);

    /**
     * 根据 品牌id 或 分类id 查询最新文章或视频 多条数据
     *
     * @param type 1-品牌文章 2-分类文章
     * @param articleBrandIdOrTypeId 品牌id 或 分类id
     * @return
     */
    List<CombinedArticleInfoByArticleBrandAndHotValue> getArticleByBrandIdOrTypeId(@Param("type")Integer type, @Param("articleBrandIdOrTypeId")Integer articleBrandIdOrTypeId);

    /**
     * 查询指定数目的用户文章
     * @param userId
     * @return
     */
    List<CombinedArticleInfoByArticleBrandAndHotValue> queryUserArticleInfoByUserId(@Param("userId") Integer userId, @Param("recordSize") int recordSize);

    /**
     * 根据品牌id或分类id查询文章条数
     *
     * @param type 类型 1-品牌 2-分类
     * @param articleBrandIdOrTypeId 品牌id 或 分类id
     * @param recordSize 查询条数
     * @return
     */
    List<CombinedArticleInfoByArticleBrand> queryArticleInfoOfBrandOrType(@Param("type")Integer type, @Param("articleBrandIdOrTypeId")Integer articleBrandIdOrTypeId, @Param("recordSize") int recordSize);

    /**
     * 如果该品牌没有文章了，那么就找关联品牌文章，如果没有关联品牌就找关联分类文章
     *
     * @param type 类型 1-品牌 2-分类
     * @param articleBrandIdOrTypeId 品牌id 或 分类id
     * @param recordSize 查询条数
     * @return
     */
    List<CombinedArticleInfoByArticleBrand> getLinkArticle(@Param("type")Integer type, @Param("articleBrandIdOrTypeId")Integer articleBrandIdOrTypeId, @Param("recordSize") int recordSize);

    /**
     *
     * @param userId
     * @param type
     * @return
     */
    List<ArticleInfo> getUserCreateOrModifyArticle(@Param("userId") Integer userId, @Param("type") Integer type);

    /**
     * 获取本周的用户发布数量列表
     * @param userId 用户 ID
     * @param firstDayOfWeek 本周第一天
     * @param lastDayOfWeek 本周最后一天
     * @return 本周的用户发布数量列表
     */
    List<CombinedCustomerInfo> getCurrentWeekPublishData(@Param("userId") Integer userId, @Param("firstDayOfWeek") String firstDayOfWeek, @Param("lastDayOfWeek") String lastDayOfWeek);

    /**
     * 获取本月的用户发布数量列表
     * @param userId 用户 ID
     * @param firstDayOfMonth 本月第一天
     * @param lastDayOfMonth 本月最后一天
     * @return 本月的用户发布数量列表
     */
    List<CombinedCustomerInfo> getCurrentMonthPublishData(@Param("userId") Integer userId, @Param("firstDayOfMonth") String firstDayOfMonth, @Param("lastDayOfMonth") String lastDayOfMonth);

    /**
     * 获取本季的用户发布数量列表
     * @param userId 用户 ID
     * @param firstDayOfSeason 本季第一天
     * @param lastDayOfSeason 本季最后一天
     * @return 本季的用户发布数量列表
     */
    List<CombinedCustomerInfo> getCurrentSeasonPublishData(@Param("userId") Integer userId, @Param("firstDayOfSeason") String firstDayOfSeason, @Param("lastDayOfSeason") String lastDayOfSeason);

    /**
     * 获取本季的用户发布数量列表（按月份）
     * @param userId 用户 ID
     * @param firstMonthOfSeason 本季第一个月份
     * @param lastMonthOfSeason 本季最后一个月份
     * @return 本季的用户发布数量列表（按月份）
     */
    List<CombinedCustomerYearInfo> getCurrentSeasonPublishDataByMonth(@Param("userId") Integer userId, @Param("firstMonthOfSeason") Integer firstMonthOfSeason, @Param("lastMonthOfSeason") Integer lastMonthOfSeason);

    /**
     * 获取年度的用户发布数量列表
     * @param userId 用户 ID
     * @return 年度的用户发布数量列表
     */
    List<CombinedCustomerYearInfo> getCurrentYearPublishData(Integer userId);
}
